// 版权归Go作者所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package net

import (
	"runtime"
	"syscall"
	"time"
)

func setKeepAlivePeriod(fd *netFD, d time.Duration) error {
	// 内核期望毫秒，所以四舍五入到下一个最高值
	// 毫秒。
	msecs := int(roundDurationUp(d, time.Millisecond))

	// 通常我们会执行
	// 系统调用。SetsockoptInt（fd.sysfd，syscall.IPPROTO_TCP，syscall.TCP_KEEPINTVL，secs）
	// 在这里，但我们不能，因为Solaris没有TCP_KEEPINTVL。
	// Solaris有TCP_KEEPALIVE_ABORT_阈值，但它不是同一个
	// 东西，它指的是直到终止的总时间（不是两个
	// 探测之间），它使用指数退避算法，而不是
	// 在两个探测之间等待相同的时间。我们不能指望最好的
	// 无论如何也要这样做，就像在达尔文一样，因为Solaris最终可能会
	// 为illumos上的
	// TCP_KEEPINTVL的值分配一个具有不同含义的常量。

	err := fd.pfd.SetsockoptInt(syscall.IPPROTO_TCP, syscall.TCP_KEEPALIVE_THRESHOLD, msecs)
	runtime.KeepAlive(fd)
	return wrapSyscallError("setsockopt", err)
}
